import router from './router' // 我们自己new的router对象（相当于this.$router）
import store from './store' // new出来store对象（this.$store）
import { Message } from 'element-ui' // 消息提示框
// 如果想看包的作用最好去npmjs.com网站看
import NProgress from 'nprogress' // 进度条插件
import 'nprogress/nprogress.css' // 进度条样式
import { getToken } from '@/utils/auth' // getToken方法
import getPageTitle from '@/utils/get-page-title' // 拿到获取标题的方法拼接后面settings里的title(用于设置浏览器标签栏上的title)

NProgress.configure({ showSpinner: false }) // 环形进度隐藏
// 知识点：分析代码思路
// 1、先找官方文档，读一读
// 2、在自己改改试一试，分析分析改改，打印打印、、、、、
// 3、百度/问别人
// 4、放放，在不影响核心逻辑的情况下联想上下文，猜

const whiteList = ['/login'] // 不需要重定向的白名单

// beforeEach全局路由前置守卫
router.beforeEach(async(to, from, next) => { // 路由全局前置守卫
  NProgress.start() // 当路由页面切换时, 显示进度条

  // 知识点：给浏览器上面标签栏上的标题设置文字（类似index.html中title的作用）
  // title标签静态的，document.title可以在js代码运行时候动态修改
  // to.meta.title 拿到的router.index.js里路由规则对象中提前存放的标题文字
  document.title = getPageTitle(to.meta.title) // 用路由信息拿出设置浏览器标签栏上标题

  const hasToken = getToken() // 获取token

  if (hasToken) { // 如果有token代表已登录
    if (to.path === '/login') { // 还想要去登录页面, 阻止下来
      next({ path: '/' }) // 重新强制给你打回首页
      NProgress.done() // 关闭进度条
    } else { // 去其他页面
      const hasGetUserInfo = store.getters.name // 尝试提取用户信息从vuex
      if (hasGetUserInfo) { // 如果有放行
        next()
      } else { // 进行网络请求
        try {
          // get user info
          // 如果已登录代表有token，但是无用户信息，调用actions里请求拿到用户名字等
          // 添加到vuex
          await store.dispatch('user/getInfo')
          // 等待网络请求成功，放到下一个正文页面
          next()
        } catch (error) { // 如果请求失败(例如401/报错, 返回登录页面, 清除本地token)
          // remove token and go to login page to re-login
          await store.dispatch('user/resetToken')
          // 给用户一个提示框
          Message.error(error || 'Has Error')
          // 打回登录页面（token过期，回去重新登录）
          // 给登录页面进行路由跳转传参（把本来要去的页面to.path地址给登录页面）
          // 登录后不会去首页，而是去到刚才没过去的那个未遂的页面上
          next(`/login?redirect=${to.path}`)
          NProgress.done()
        }
      }
    }
  } else { // 如果没有token, 要去的路径是白名单里的
    if (whiteList.indexOf(to.path) !== -1) { // 在白名单路（例如：登录/login）正常放行
      // includes()判断存在返回true
      // indexOf()查找下标
      // in the free login whitelist, go directly
      next()
    } else { // login页面带上之前未遂地址
      // 无token（没登陆）还想去正常的页面就打回登陆页面
      // 知识点：next()里面有路径，就会再次发生一次路由跳转，路由守卫会从从头在重新执行一遍
      next(`/login?redirect=${to.path}`)
      NProgress.done()
    }
  }
})
// 全局路由后置守卫(路由跳转完成再触发（）里函数体)
router.afterEach(() => { // 路由跳转成功, 关闭进度条
  NProgress.done()
})
// 拿到一个半截项目 1天-1月内你会非常痛苦，一切都靠挺，挺过去海阔天空
